#ifndef NETWORKSERVICES_BUFFER_H
#define NETWORKSERVICES_BUFFER_H

#include <string>
#include <cstring>
#include <iostream>

class Buffer {
public:
    Buffer(uint16_t sep = 1) : sep(sep)
    {}

    ~Buffer() = default;

    void Append(const char *data, size_t size)
    {
        buf.append(data, size);
    }

    void AppendWithSep(const char *data, size_t size)
    {
        if (sep == 0) {
            buf.append(data, size);
        } else if (sep == 1) {
            buf.append((char *) &size, 4);
            buf.append(data, size);
        }
    }

    void Erase(size_t pos, size_t nn)
    {
        buf.erase(pos, nn);
    }

    size_t Size()
    {
        return buf.size();
    }

    const char *Data()
    {
        return buf.data();
    }

    void Clear()
    {
        buf.clear();
    }

    bool PickMessage(std::string &ss)
    {
        if (buf.empty()) {
            return false;
        }

        if (sep == 0) {
            ss = buf;
            buf.clear();
        } else if (sep == 1) {
            int len;
            memcpy(&len, buf.data(), 4);                    // 从buf_中获取报文头部。
            if (buf.size() < len + 4) return false;         // 如果buf_中的数据量小于报文头部，说明buf_中的报文内容不完整。
            ss = buf.substr(4, len);                        // 从buf_中获取一个报文。
            buf.erase(0, len + 4);                          // 从buf_中删除刚才已获取的报文。
        }

        return true;
    }

private:
    std::string buf;
    const uint16_t sep;         // 报文的分隔符：0-无分隔符(固定长度、视频会议)；1-四字节的报头；2-"\r\n\r\n"分隔符（http协议）。
};


#endif // NETWORKSERVICES_BUFFER_H
